//
//  HOPPhotoBrowserCellCollectionViewCell.swift
//  WB01
//
//  Created by HOP on 16/1/1.
//  Copyright © 2016年 HOP. All rights reserved.
//

import UIKit

import SVProgressHUD

import SDWebImage

import FLAnimatedImage

let ImageViewMinimumZoomScale: CGFloat = 0.5

class HOPPhotoBrowserCell: UICollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)
//        准备UI
        prepareUI()
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    // MARK: - 准备UI
    private func prepareUI() {
        // 设置scrollView代理,来缩放imageView
        scrollView.delegate = self
        scrollView.maximumZoomScale = 2
        scrollView.minimumZoomScale = ImageViewMinimumZoomScale
      // 添加子控件
    contentView.addSubview(scrollView)
        // TODO: 注意,imageView需要添加到scrollView里面,不然不能方法和滚动
        scrollView.addSubview(imageView)
        contentView.addSubview(indicator)
        // 添加约束
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        indicator.translatesAutoresizingMaskIntoConstraints = false
        // scrollView填充父控件
        
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[sv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["sv" : scrollView]))
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[sv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["sv" : scrollView]))
        // imageView宽高不固定,不直接使用autoLayout约束,通过frame来确定位置
        // 菊花, 父控件居中
        
        contentView.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
        contentView.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0))
    }
    // MARK: - 属性
    /// cell要显示图片的url
    var imageURL: NSURL? {
        didSet {
            // cell会使用上一张的缓存图片,在显示图片之前清空上一张的缓存
            imageView.image = nil
            // 清空scrollView的属性,imageView的trnsform
            resetProterties()
            /// 控制器设置了url,使用SDWebImage去加载图片
            /// 1.去内存缓存加载
            /// 2.内存缓存没有,去磁盘加载
            /// 3.磁盘上面也没有,就会去网络上面加载图片
            /// 4.从网络加载图片后,会缓存到内存和磁盘
            // 添加子控件
            
//            indicator.startAnimating()
//            imageView.sd_setImageWithURL(imageURL) { (image, error, _, _) -> Void in
//                // 关闭菊花
//                self.indicator.stopAnimating()
//                if error != nil {
//                print("下载图片出错")
//                return
//                
//                }
//                // 获取到图片,修改imageView的大小
//                self.layoutImageView(image)
//
            // 判断图片是否已经下载过
            // SDWebIamage默认保存图片的路径
            let path = SDWebImageManager.sharedManager().imageCache.defaultCachePathForKey(imageURL!.absoluteString)
        // 加载数据
            let data = NSData(contentsOfFile: path)
            if data != nil {
            // 表示之前有缓存
            let image = UIImage(data: data!)!
            self.setImage(image, data: data!)
            return
            }
            // 下载图片并显示
            // 使用SDWebImage来下载图片

            SDWebImageDownloader.sharedDownloader().downloadImageWithURL(imageURL, options: SDWebImageDownloaderOptions(rawValue: 0), progress: { (receive, total) -> Void in
                let progress = Float(receive) / Float(total)
                // 在主线程更新UI
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    SVProgressHUD.showProgress(progress)
                })
                }) { (image, data, error, finished) -> Void in
                     print("下载图片完成: \(NSThread.currentThread())")
                    // 我们手动调用的下载,SDWebImage不会自动缓存起来,需要我们手动来缓存,下次直接使用缓存好的图片,不需要在去网路上加载
                    // image: 要保存的图片
                    // recalculateFromImage: 保存的图片是否要重新压缩,
                    // imageData: 保存图片的二进制
                    // SDWebImage保存图片,使用url地址进行MD5加密
                    // toDisk: 是否要保存到沙盒
                   SDWebImageManager.sharedManager().imageCache.storeImage(image, recalculateFromImage: false, imageData: data, forKey: self.imageURL!.absoluteString, toDisk: true)
                    // 显示图片,需要在主线程上面执行
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.setImage(image, data: data)
                    })
            }
        }
        }
    private func setImage(image: UIImage, data: NSData) {
    // 判断图片类型,是否是gif图片
    let gif = self.imageURL!.absoluteString.lowercaseString.hasSuffix("gif")
     // 如果不是gif图片
        if !gif {
        // 显示普通图片
        self.imageView.image = image
        
        
        } else {
        // 创建gifImage
        let animatedImage = FLAnimatedImage(animatedGIFData: data)
        // 显示gif图片
            self.imageView.animatedImage = animatedImage
        }
    SVProgressHUD.dismiss()
        // 修改imageView的大小
    self.layoutImageView(image)
      }
    /// 清空scrollView的属性,imageView的trnsform,防止cell复用
    private func resetProterties() {
    imageView.transform = CGAffineTransformIdentity
    scrollView.contentInset = UIEdgeInsetsZero
    scrollView.contentSize = CGSizeZero
    scrollView.contentOffset = CGPointZero
    
    }
    /*
    将图片等比例缩放到宽度等于屏幕的宽度
    1.长图,高度大于屏幕的高度
    长图从顶部开始显示
    2.短图,高度小于屏幕的高度
    短图居中显示
    */
    /// 重新布局imageView的frame
    private func layoutImageView(image: UIImage) {
    // 1.计算缩放后的大小
    let newSize = displaySize(image)
    // 2.判断长短图
        if newSize.height < UIScreen.mainScreen().bounds.height {
        // 短图,居中显示
        // 设置frame.origin.y值后当放大图片的时候,frame.origin.y是不会变化的.图片放大到大于屏幕的高度时.下面会显示不完整,需要拖动才看的到
        imageView.frame = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)
        let offsetY = (UIScreen.mainScreen().bounds.height - newSize.height) * 0.5
        scrollView.contentInset = UIEdgeInsets(top: offsetY, left: 0, bottom: offsetY, right: 0)
        } else {
        // 长图
        imageView.frame = CGRect(origin: CGPointZero, size: newSize)
             // 设置scrollView contentSize,使图片可以滚动显示
            scrollView.contentSize = newSize
        }
    
    
    }
    /// 将图片等比例缩放到宽度等于屏幕的宽度
    private func displaySize(image: UIImage) -> CGSize {
    let newWidth = UIScreen.mainScreen().bounds.width
    // 新的高度 / 新的宽度 = 原来的高度 / 原来的宽度
    let newHeight = newWidth * image.size.height / image.size.width
    // 返回等比例缩放好的尺寸
    return CGSize(width: newWidth, height: newHeight)
    }
        // MARK: - 懒加载
        /// scrollView 
    private lazy var scrollView = UIScrollView()
        
    /// imageView显示图片
     lazy var imageView: HOPImageView = HOPImageView()
    /// 菊花,显示加载进度
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
    
    
    }
    // MARK: - 扩展CZPhotoBrowserCell 实现 UIScrollViewDelegate 来设置图片的缩放
extension HOPPhotoBrowserCell: UIScrollViewDelegate {
/// 告诉scrollView需要缩放哪个view
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        // scrollView缩放其实是改变imageView的transform
        return imageView
    }
/// scrollView每次缩放图片都会调用
    func scrollViewDidZoom(scrollView: UIScrollView) {
//         print("scrollViewDidZoom imageView: \(imageView.transform)")
    }
    /// scrollView缩放结束会调用
    /// 当我们的缩放小于最小缩放比例时,不会立马scrollViewDidEndZooming,而会先自动动画到左上角,再调用scrollViewDidEndZooming,来通知我们缩放完成,我们不让他缩放到比指定的最小缩放比例还小，覆盖imageView的transfrom,不让scrollView将imageView的transfrom设置的比最小缩放比例还小
    /// 注意:当scrollView缩放后,imageView的bounds不会变化的.frame会变化,要获取缩放后的大小,使用frame
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        print("scrollViewDidEndZooming imageView: \(imageView.transform)")
        // 居中图片
        var offsetX = (scrollView.bounds.width - imageView.frame.width) * 0.5
        var offsetY = (scrollView.bounds.height - imageView.frame.height) * 0.5
        // 判断 offestX,offestY 不能小于0, offestX > 0 会往右边顶, offestX < 0会往左边扯,有一些内容会看不到,当offestX < 0 时 offestX = 0
        offsetX = offsetX < 0 ? 0 : offsetX
        offsetY = offsetY < 0 ? 0 : offsetY
        UIView.animateWithDuration(0.25) { () -> Void in
            scrollView.contentInset = UIEdgeInsets(top: offsetY, left: offsetX, bottom: 0, right: 0)
        }
    }
}






























    
